﻿using Microsoft.EntityFrameworkCore;
using 示例中体现的ModelBus核心思想.Data;
using 示例中体现的ModelBus核心思想.ModelBus;
using 示例中体现的ModelBus核心思想.Models.Data;
using 示例中体现的ModelBus核心思想.Models.Domain;

namespace 示例中体现的ModelBus核心思想.Services
{
    /// <summary>
    /// 业务服务实现：通过ModelBus协调领域模型和数据模型
    /// 专注于业务逻辑，不直接操作数据模型
    /// </summary>
    public class ProductService : IProductService
    {
        private readonly AppDbContext _dbContext;
        private readonly ModelBusCoordinator _modelBus;

        // 注入数据上下文和ModelBus协调器
        public ProductService(AppDbContext dbContext, ModelBusCoordinator modelBus)
        {
            _dbContext = dbContext;
            _modelBus = modelBus;
        }

        public async Task<Product> GetByIdAsync(Guid id)
        {
            // 1. 从数据库获取数据模型
            var productData = await _dbContext.Products.FindAsync(id);

            // 2. 通过ModelBus将数据模型转换为领域模型
            return _modelBus.Convert<ProductData, Product>(productData);
        }

        public async Task<IEnumerable<Product>> GetAllAsync()
        {
            var productDatas = await _dbContext.Products.ToListAsync();
            return _modelBus.Convert<ProductData, Product>(productDatas);
        }

        public async Task<Product> CreateAsync(Product product)
        {
            // 业务规则验证（领域层逻辑）
            if (product.Price <= 0)
                throw new ArgumentException("商品价格必须大于0");

            // 通过ModelBus将领域模型转换为数据模型
            var productData = _modelBus.Convert<Product, ProductData>(product);

            // 保存到数据库
            _dbContext.Products.Add(productData);
            await _dbContext.SaveChangesAsync();

            // 返回转换后的领域模型（包含存储生成的属性）
            return _modelBus.Convert<ProductData, Product>(productData);
        }

        public async Task<Product> UpdateAsync(Product product)
        {
            var existingData = await _dbContext.Products.FindAsync(product.Id);
            if (existingData == null)
                throw new KeyNotFoundException("商品不存在");

            // 转换领域模型到数据模型（仅更新需要的字段）
            var updatedData = _modelBus.Convert<Product, ProductData>(product);
            existingData.Name = updatedData.Name;
            existingData.Price = updatedData.Price;
            existingData.StatusCode = updatedData.StatusCode;

            await _dbContext.SaveChangesAsync();
            return _modelBus.Convert<ProductData, Product>(existingData);
        }

        public async Task DeleteAsync(Guid id)
        {
            var productData = await _dbContext.Products.FindAsync(id);
            if (productData != null)
            {
                _dbContext.Products.Remove(productData);
                await _dbContext.SaveChangesAsync();
            }
        }
    }
}
